import type { InjectionKey } from 'vue'
import type {
  RuleItem,
  ValidateError,
  ValidateFieldsError
} from 'async-validator'
export interface FormItemProps {
  label: string
  prop?: string
}
export interface FormItemRule extends RuleItem {
  trigger?: string
}
export type FormRules = Record<string, FormItemRule[]>
export interface FormProps {
  model: Record<string, any>
  rules: FormRules
}
export interface FormContext extends FormProps {
  addField: (field: FormItemContext) => void
  removeField: (field: FormItemContext) => void
}
export interface ValidateStatusProp {
  state: 'init' | 'success' | 'error'
  errorMsg: string
  loading: boolean
}
export interface FormValidateFailure {
  errors: ValidateError[] | null
  fields: ValidateFieldsError
}
export const formContextKey: InjectionKey<FormContext> = Symbol('formContext')
export interface FormItemContext {
  prop: string
  validate: (trigger?: string) => Promise<any>
  clearValidate(): void
  resetField(): void
}
export const formItemContextKey: InjectionKey<FormItemContext> =
  Symbol('formItemContext')
export interface FormInstance {
  validate: () => Promise<any>
  resetFields(props?: string[]): void
  clearValidate(props?: string[]): void
}
export interface FormItemInstance {
  validateStatus: ValidateStatusProp
  validate: (trigger?: string) => Promise<any>
  resetField(): void
  clearValidate(): void
}
